package xitong_controller

import (
	"server/apps/xitong"
	xitong_s7 "server/apps/xitong/services"
	"server/global"
	"server/model/common/response"
	"time"

	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
)

type LoginCr struct{}

var loginS7 = new(xitong_s7.LoginS7)

// Login 处理用户登录请求
// @Tags     AdminLogin
// @Summary  用户名密码登录
// @Produce  application/json
// @Param    data  body      request.LoginRequest                 true  "账号, 密码, 验证码"
// @Success  200   {object}  response.Response{data=interface{}}  "登录成功返回token等信息"
// @Router   /login [post]
func (l *LoginCr) Login(c *gin.Context) {
	var req xitong.LoginRequest
	// 绑定请求参数
	if err := c.ShouldBindJSON(&req); err != nil {
		response.FailWithMessage(err.Error(), c)
		return
	}
	// 参数校验
	if err := req.Verify(); err != nil {
		response.FailWithMessage(err.Error(), c)
		return
	}

	// 验证码二次验证（如果存在）
	if req.CaptchaVerification != "" {
		if err := verifyCaptcha(req.CaptchaType, req.CaptchaVerification); err != nil {
			global.A_LOG.Error("验证码验证失败", zap.Error(err))
			response.FailWithCode(400336, c) // 对应PHP的400336错误码
			return
		}
	}

	// 密码长度校验（注释保留，根据需要开启）
	// if len(utils.Trim(req.Password)) < 6 || len(utils.Trim(req.Password)) > 32 {
	// 	response.FailWithCode(400762, c)
	// 	return
	// }

	// 账号密码验证（调用服务层）
	result, err := loginS7.Login(req.Account, req.Password, "admin", req.Key)
	if err != nil || result == nil {
		// 登录失败处理：记录失败次数
		loginFailKey := "login_captcha:" + c.ClientIP()
		failCount, _ := global.A_REDIS.Incr(global.A_CTX, loginFailKey).Result()
		global.A_REDIS.Expire(global.A_CTX, loginFailKey, 60*time.Second) // 过期时间60秒

		// 返回失败信息（超过1次失败需要显示验证码）
		data := map[string]int{"login_captcha": 0}
		if failCount > 1 {
			data["login_captcha"] = 1
		}
		response.FailWithCodeAndData(400140, data, c)
		return
	}

	// 登录成功：清除失败次数缓存
	global.A_REDIS.Del(global.A_CTX, "login_captcha:"+c.ClientIP())
	response.OkWithData(result, c)
}

// Info 获取登录页面信息
// @Tags     AdminLogin
// @Summary  获取登录页面配置数据
// @Produce  application/json
// @Success  200   {object}  response.Response{data=interface{}}  "返回登录页信息"
// @Router   /login/info [get]
func (l *LoginCr) Info(c *gin.Context) {
	// 调用服务层获取登录页信息（如系统名称、版本等）
	info, err := loginS7.GetLoginInfo()
	if err != nil {
		global.A_LOG.Error("获取登录信息失败", zap.Error(err))
		response.FailWithMessage("获取登录信息失败", c)
		return
	}
	response.OkWithData(info, c)
}

// 验证码二次验证（封装AJ验证码验证逻辑）
func verifyCaptcha(captchaType, verification string) error {
	// 实现PHP中aj_captcha_check_two的逻辑
	// 例如：调用第三方验证码服务验证verification
	// if 验证失败 {
	// 	return errors.New("验证码验证失败")
	// }
	return nil
}
